#ifndef COMMAND_H_
#define COMMAND_H_
#include <stdint.h>

// 定义基本数据类型
#ifdef _WIN32
#include "typedefs.h"
// 无符号型
#define BYTE    unsigned char
#define WORD    unsigned short int
#define DWORD   unsigned int
#define QWORD   unsigned long long
// 有符号型
#define SBYTE   char
#define SWORD   short
#define SDWORD  int
#define SQWORD  long long
#else
// 无符号型
#define BYTE    uint8_t
#define WORD    uint16_t
#define DWORD   uint32_t
#define QWORD   uint64_t
// 有符号型
#define SBYTE   int8_t
#define SWORD   int16_t
#define SDWORD  int32_t
#define SQWORD  int64_t
#endif //_WIN32

//指令版本号
#define DEFAULT_CMD_VERSION     20131010 // <=DWORD类型的最大值 
#define CMD_VERSION_20140401    20140401
#define CMD_VERSION_20140409    20140409
#define CURRENT_CMD_VERSION     20140409 // <=DWORD类型的最大值 

#pragma pack(1)
namespace Cmd {
        //  main cmd declaration
        enum {
                CMD_NULL        = 0x0000,
                CMD_LOGIN       = 0x0001,
                CMD_ROOM        = 0x0002,
                CMD_BUDDY       = 0x0003,
                CMD_SEARCH      = 0x0004,
                CMD_USERINFO    = 0x0005,
                CMD_MONITOR     = 0x0006,
                CMD_NOTICE      = 0x0007,
                CMD_GROUP       = 0x0008,
                CMD_DISCUSS     = 0x0009,
                CMD_MIS         = 0x000A,
                CMD_MISC        = 0x000B,
        };

        //  sub cmd declaration
        enum {
                SCMD_NULL = 0x0000, //CMD_NULL
                SCMD_HEARTBEAT,
                SCMD_HEARTBEAT_MOBILE,
        };


        //  cmd definition
        struct t_NullCmd
        {
                t_NullCmd():
                        wCmd(CMD_NULL), wSubCmd(SCMD_NULL)
                {
                }
                t_NullCmd(WORD cmd, WORD subcmd):
                        wCmd(cmd), wSubCmd(subcmd)
                {
                }
                union {
                        struct {
                                WORD wCmd;
                                WORD wSubCmd;
                        };
                        struct {
                                WORD cmd;
                                WORD para;
                        };
                };
        };
        //server->client->server
        struct stHeartBeatCmd1:
                t_NullCmd
        {
                stHeartBeatCmd1()
                {
                }
        };
        //client->server->client
        struct stHeartBeatCmd2:
                t_NullCmd
        {
                stHeartBeatCmd2():
                        t_NullCmd(CMD_NULL, SCMD_HEARTBEAT)
                {
                }
        };
        struct stHeartBeatMobile:
                t_NullCmd
        {
                stHeartBeatMobile():
                        t_NullCmd(CMD_NULL, SCMD_HEARTBEAT_MOBILE)
                {
                        timestamp_ = 0;
                }
                QWORD timestamp_;
        };
}; //namespace Cmd
#pragma pack() //pack(1)

//定义长度宏
#define MAX_IP_LENGTH		16
#define MAX_PASSWORD_SIZE	32      //md5.
#define MAX_NAME_SIZE	        48      //昵称长度.     <=12汉字	
#define MAX_ROOM_NAME_SIZE      64      //房间名称长度.
#define MAX_ROOM_DESC_SIZE      255     //房间描述长度.
#define MAX_REMARK_SIZE		48      //好友备注长度. <=12汉字
#define MAX_MOOD_SIZE	        100     //个人心情长度. <=25汉字	
#define MAX_ACCOUNT_SIZE	64	//用户帐号长度.
#define MAX_GROUP_NAME_SZIE     32
#define MAX_AVATAR_SIZE		128
#define MAX_ADD_BUDDY_INFO_LEN  80
#define MAX_DENY_BUDDY_INFO_LEN 100     //请求添加好友验证信息. <=25汉字
#define MAX_DATETIME_SIZE	32      //
#define MAX_ADD_ROOM_BLACK_REASON 80    //将房间用户加入黑名单的原因长度. <=20汉字
#define MAX_CMD_LEN_TO_USER     8192    //客户端可以接收的单条消息的最大长度
#define MAX_OPENCLASS_NAME_SIZE 128     //公开课名称长度
#define MAX_OPLUS_NAME_SIZE     128     //O+课名称长度
#define MAX_APP_BRAND_SIZE      50      //设备品牌名称长度
#define MAX_APP_SDK_VERSION_SIZE 10     //sdk版本长度
#define MAX_APP_DEVICE_ID_SIZE  16      //移动设备号
#define MAX_MAC_ADDR_SIZE       32      //mac地址长度
#define MAX_CELLPHONE_NUM_SIZE  16      //手机号码
#define MAX_TOKEN32_SIZE        32      //32位token(由平台生成)
#define MAX_INDIVIDUAL_CHAT_MSG_SIZE    1024*3
#define MAX_ROOM_CHAT_MSG_SIZE  1024*3
#define DEVICE_ID_LENGTH        64      // 设备ID长度.

//定义时间宏
#define DEFAULT_MIC_TIME        600     //默认麦序时长
#define MIN_MIC_TIME            5       //最小麦序时长
#define MAX_MIC_TIME            0XFFFE  //最大麦序时长
#define TOKEN_EXPIRE_TIME       48*3600 //token保质期
#define MIN_TOKEN_EXPIRE_TIME   24*3600 //token保质期下限

//定义讨论组相关的宏
#define MAX_DISCUSS_TOPIC_LEN   64      //讨论组topic最大长度
#define DISCUSS_MEMBER_DEFAULT_LIMIT 50 //默认最大成员数量
#define DISCUSS_TIMEOUT_TIME    30*3600*24      //讨论组不活跃 30天删除
#define MAX_DISCUSS_CHAT_MSG_SIZE      1024*3 

//定义群相关的宏
#define GROUP_MEMBER_DEFAULT_LIMIT 100  //群的默认成员数量上限
#define GROUP_MANAGER_DEFAULT_LIMIT 5   //群的默认管理员数量上限
#define MAX_GROUP_INTRO_SIZE    128     //群的简介长度限制
#define MAX_GROUP_TAGS_SIZE     100     //群的tag字符串长度限制
#define MAX_GROUP_AUTH_INFO_SIZE   80   //申请加入群的验证信息
#define MAX_GROUP_DENY_INFO_SIZE   100  //申请加入群的拒绝信息
#define DEFAULT_MIN_NORMAL_GROUP_ID 81500000  //默认最小的普通群号码
#define DEFAULT_MAX_NORMAL_GROUP_ID 81599999  //默认最大的普通群号码
#define DEFAULT_GROUP_NUM_LIMIT 3       //每个用户的默认创建群的数量
#define MAX_GROUP_CHAT_MSG_SIZE      1024*3 

//定义基础功能相关宏
#define ARS_DEFAULT_SWITCH      1       // 自动寻路(开启)
#define ARS_DEFAULT_TIMEOUT     10      // 网络探测1次的超时时间(s)
#define ARS_DEFAULT_THRESHOLD   80      // 网络探测结果的警戒值(ms)
#define ARS_DEFAULT_PACK_NUM    1       // 寻路包样本数(个)
#define ARS_DEFAULT_PACK_IT     50      // 寻路包间隔时间(ms)
#define ARS_DEFAULT_NG_DELAY    300     // 语音质量-延迟警戒值(ms)
#define ARS_DEFAULT_NG_PLR      15      // 语音质量-丢包率警戒值(%)
#define ARS_DEFAULT_BAD_DELAY   600     // 语音质量-延迟差标准(ms)
#define ARS_DEFAULT_BAD_PLR     30      // 语音质量-丢包率差标准(%s)

//定义用户登录返回值
enum eLoginRetCode
{
        eLoginRetCode_Fail = 0x0001,	//登录失败
        eLoginRetCode_Success,		//登录成功
        eLoginRetCode_InvalidVersion,	//版本受限
        eLoginRetCode_InvalidIP,	//IP受限
        eLoginRetCode_InvalidMac,	//MAC受限
        eLoginRetCode_InvalidAccount,	//帐号不存在
        eLoginRetCode_InvalidToken,	//令牌错误
        eLoginRetCode_TimeOut,		//登录超时
        eLoginRetCode_LockedAccount,	//帐号被封
        eLoginRetCode_InvalidPasswd,	//帐号密码不匹配
        eLoginRetCode_TooMuchAll,       //所有用户登录过于频繁(匿名登录)
        eLoginRetCode_TooMuchSameIp,    //同IP用户登录过于频繁(匿名登录)
};
//定义用户IM在线状态
enum eIMOnlineStatus {
        USER_STATE_ONLINE = 0,          /*< 在线 */
        USER_STATE_QUEUE,		/*< 排队 */
        USER_STATE_MEETING,		/*< 会议 */
        USER_STATE_BUSY,		/*< 忙碌 */
        USER_STATE_LEAVE,		/*< 离开 */
        USER_STATE_HIDE,		/*< 隐身 */
        USER_STATE_OFFLINE,		/*< 下线 */
        USER_STATE_REQUESTED,           /*< 好友请求 >*/
        USER_STATE_NOTFRIENDS,          /*< 非好友*/
        USER_STATE_UNKNOW,		/*< 未知 */
        USER_STATE_ONLINE_MOBILE,       /*< 移动端在线 >*/
};
//定义用户进入房间的返回值
enum eJoinRoomRet
{
        eJoinRoomRet_Success = 1,	//进入成功
        eJoinRoomRet_Fail,		//进入失败
        eJoinRoomRet_Full,		//房间人数已满
        eJoinRoomRet_NeedPasswd,	//需要密码
        eJoinRoomRet_InvalidPasswd,	//密码错误
        eJoinRoomRet_InvalidPower,	//权限不足
        eJoinRoomRet_NotExist,		//房间不存在
        eJoinRoomRet_InBlackList,       //用户在黑名单中
};
//定义房间模式
enum eRoomMode
{
        eRoomMode_Dialog = 0,		//对话模式
        eRoomMode_MicQueue,		//麦序模式
        eRoomMode_Class,		//课堂模式
};
//定义用户在房间的权限
//新增类型时必须赋值:
//--有管理权限的低4位为0
//--无管理权限的高4位为0
enum eRoomAuthority
{
        eRoomAuthority_Null             = 0x00,	//普通用户(私密教室中：买课的学生)
        eRoomAuthority_Market           = 0x01, //营销人员
        eRoomAuthority_Manager          = 0x10, //管理员
        eRoomAuthority_Teacher          = 0x20, //教师
        eRoomAuthority_Moderator        = 0x30, //主持人
        eRoomAuthority_Anonymous        = 0x40, //匿名用户(只会存在与公共教室）
        eRoomAuthority_Invalid          = 0xff, //游客（私密教室中：删除的学生）
};
enum eRoomType
{
        eRoomType_Activity      = 1,    //活动房间.后台设置对某些人可见
        eRoomType_Class         = 2,    //班级房间.与特定的班级对应的房间
        eRoomType_Public        = 6,    //公共房间.所有人可见
};
//定义udp 消息协议类型
enum eUDPProtoType
{
        eUDPProtoType_null = 0x00,
        eUDPProtoType_RTP,
        eUDPProtoType_RTCP,
};
//定义udp 转发数据类型
enum eUDPDataType
{
        eUDPDataType_null = 0x00,
        eUDPDataType_audio,
        eUDPDataType_video,
        eUDPDataType_desktop,
};

//定义Room app bit mask
enum eRoomAppBitMask
{
        eRoomAppBitMask_null,
        eRoomAppBitMask_WhiteBoard      = (0x00000001<<0),
        eRoomAppBitMask_Video           = (0x00000001<<1),
        eRoomAppBitMask_Desktop         = (0x00000001<<2),
};
//定义Room Video类型
enum eRoomVideoType
{
        eRoomVideoType_Null = 0x00,
        eRoomVideoType_Video,
        eRoomVideoType_Desktop,
};

//定义白板笔记类型
enum eRoomWhiteBoardShapeType
{
        eRoomWhiteBoardShapeType_null   = 0x00,
        eRoomWhiteBoardShapeType_text,          //文字
        eRoomWhiteBoardShapeType_straight,      //直线
        eRoomWhiteBoardShapeType_curve,         //曲线
        eRoomWhiteBoardShapeType_circular,      //圆形
        eRoomWhiteBoardShapeType_rectangle,     //矩形
};
//定义坐标
struct st2DCoordinate
{
        st2DCoordinate()
        {
                x = y = 0;
        }
        st2DCoordinate(SDWORD xx, SDWORD yy):
                x(xx), y(yy)
        {
        }
        st2DCoordinate & operator = (const st2DCoordinate &rt)
        {
                x = rt.x;
                y = rt.y;
                return *this;
        }
        SDWORD x;
        SDWORD y;
};
//定义用户下线原因
enum eLogoutReason
{
        eLogoutReason_null = 0,
        eLogoutReason_yidi,
        eLogoutReason_forbidid,
        eLogoutReason_forbidip,
};

//定义教室列表类型
enum eRoomListType
{
        eRoomListType_null = 0,
        eRoomListType_collect,  //收藏列表
        eRoomListType_history,  //历史列表
        eRoomListType_order,    //预约列表
};
//定义房间内控制信息类型
enum eRoomControlStatusType
{
        eRoomControlStatusType_allowsoundeffect = 0x00000001<<0, //允许声效
        eRoomControlStatusType_allowtext        = 0x00000001<<1, //允许文字
        eRoomControlStatusType_allowpic         = 0x00000001<<2, //允许图片
        eRoomControlStatusType_allowexpress     = 0x00000001<<3, //允许表情
        eRoomControlStatusType_allowjoinmicqueue= 0x00000001<<4, //允许抢麦
        eRoomControlStatusType_allowhandup      = 0x00000001<<5, //允许举手
        eRoomControlStatusType_allowrecord      = 0x00000001<<6, //允许录音
        eRoomControlStatusType_allowdfontdiff   = 0x00000001<<7, //允许字体不同
        eRoomControlStatusType_allowsnapshot    = 0x00000001<<8, //允许截图
};

//定义系统通知类型
enum eNoticeType
{
        eNoticeType_normal      = 0x01,         //系统通知-普通
        eNoticeType_openclass,                  //系统通知-公开课
        eNoticeType_oplus,                      //系统通知-O+
        eNoticeType_url,                        //系统通知-url连接
};

//定义聊天消息类型
enum eChatMsgType
{
        eChatMsgType_text       = 0,            //文本消息
        eChatMsgType_typing     = 1,            //正在输入
        eChatMsgType_soundeffect= 2,            //音效
        eChatMsgType_file       = 3,            //接收到对方传来的文件/发送文件传输消息
        eChatMsgType_filecomplete=4,            //向对方发送下载成功消息
        eChatMsgType_ack        =5,             //接收者回执消息
};

//定义客户端版本类型
enum eClientVersionType
{
        eClientVersionType_outer= 0,            //外部版本
        eClientVersionType_inner,               //内部版本
        eClientVersionType_outer_5,             //外部版本(5.0)
        eClientVersionType_inner_5,             //内部版本(5.0)
};

//好友分组类型
enum eFriendGroupType
{
        eFriendGroupType_sys    = 0,            //系统分组
        eFriendGroupType_custom,                //自建分组
};

//用户终端类型
enum eTerminalType
{
        eTerminalType_pc        = 0,            //pc端
        eTerminalType_mobile,                   //移动端
        eTerminalType_web,                      //web端?
        eTerminalType_pad,                      //Pad
        eTerminalType_tv,                       //电视
        eTerminalType_watch,                    //手表
};

//用户客户端操作系统类型
enum eOSType
{
        eOSType_windows         = 0,            // windows
        eOSType_linux           = 1,            // linux
        eOSType_mac             = 2,            // mac
        eOSType_android         = 3,            // android
        eOSType_ios             = 4,            // ios
        eOSType_windowsphone    = 5,            // windows phone
};

#define MIN_BUDDY_CUSTOM_GROUP_ID       50      //自建好友分组的最小ID

//性别
enum eSexType
{
        eSexType_male = 0,              //男性
        eSexType_female,                //女性
        eSexType_ambisextrous,          //两性人
};
//群成员身份
enum eGroupIdentity
{
        eGroupIdentity_normal = 0,  //普通群成员
        eGroupIdentity_manager,     //群管理员
        eGroupIdentity_owner,       //群主
};

//群类型
enum eGroupType
{
        eGroupType_normal = 0,          //普通群
        eGroupType_vip,                 //vip群
        eGroupType_org,                 //机构群
        eGroupType_sys,                 //系统后台创建的群
};

//群的创建类型
enum eGroupCreateType
{
        eGroupCreateType_client = 0,    //ct client创建
        eGroupCreateType_websys,        //web后台创建
};

//群后台操作类型
enum eGroupWebOperationType
{
        eGroupWebOperationType_create = 0,      //群后台-创建
        eGroupWebOperationType_delete,          //群后台-删除
        eGroupWebOperationType_modify,          //群后台-修改
        eGroupWebOperationType_invite,          //群后台-邀请
};

//房间配置改变类型
enum eRoomConfigChangeType
{
        eRoomConfigChangeType_add = 0,          //房间配置改变-添加
        eRoomConfigChangeType_delete,           //房间配置改变-删除
        eRoomConfigChangeType_modify,           //房间配置改变-修改
};

//用户说话状态类型
enum eRoomUserSpeakType
{
        eRoomUserSpeakType_Voice        = (0x00000001<<0),
        eRoomUserSpeakType_Video        = (0x00000001<<1),
        eRoomUserSpeakType_Desktop      = (0x00000001<<2),
};

//答题卡操作类型
enum eAnswerCardOperateType {
        eAnswerCardOperateType_Start = 0,       // 开启
        eAnswerCardOperateType_Answer,          // 答题
        eAnswerCardOperateType_Publish,         // 公布答案
};

//答题卡状态
enum eAnswerCardStatus {
        eAnswerCardStatus_Enable = 0,           // 可用（开打之前）
        eAnswerCardStatus_Editing,              // 编辑中
        eAnswerCardStatus_Answering,            // 答题中
        eAnswerCardStatus_Overed,               // 已结束
};

//操作提问问题类型
enum eQuestionModifyType {
        eQuestionModifyType_highlight = 0,      // 公示
        eQuestionModifyType_dishighlight,       // 取消公示
        eQuestionModifyType_solve,              // 标记为已解决
        eQuestionModifyType_delete,             // 删除问题
};

enum eUnRegReason {
        UNREG_REASON_NORMAL,
        UNREG_REASON_UNNORMAL,
        UNREG_REASON_USER_NOT_EXIST,
};

enum eUserLoginType {
        eUserLoginType_null = 0,
        eUserLoginType_unregistered,            // 未注册用户
        eUserLoginType_hujiang,                 // 沪江用户
};

enum eUnregsiteredState {
        eUnregsiteredState_null = 0,
        eUnregsiteredState_verify,              // 验证中
        eUnregsiteredState_online,              // 在线
        eUnregsiteredState_offline,             // 下线
};

enum eUserTaskState {
        eUserTaskState_doing = 0,               //未完成
        eUserTaskState_done_not_get_point,      //已完成-未领取奖励
        eUserTaskState_done_get_point,          //已完成-已领取奖励
};

enum eUserTaskType {
     eUserTaskType_null         = 0,
     eUserTaskType_sign_in      = 1,            //签到
     eUserTaskType_room_time    = 2,            //在房间内的时长
     eUserTaskType_hand_up      = 3,            //举手
     eUserTaskType_course_eval  = 4,            //课程评价
     eUserTaskType_online_time  = 5,            //在线时长
};

enum eUserTaskRewardType {
        eUserTaskRewardType_null = 0,
        eUserTaskRewardType_flower = 1,
};

enum eUserStatusType {
        eUserStatusType_normal   = 0,           //正常
        eUserStatusType_locked   = 1,           //锁定
        eUserStatusType_inactive = 2,           //未激活
};

enum eUserOptionType {
        eUserOptionType_null    = 0,
        eUserOptionType_push    = (0x0001<<0),
        eUserOptionType_sound   = (0x0001<<1),
        eUserOptionType_vib     = (0x0001<<2),
};

#endif //COMMAND_H_
